package org.richin.support.orm;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.hibernate.LockMode;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;

public interface IHibernateDaoSupport<T, ID extends java.io.Serializable>
		extends DaoSupport<T, ID> {
	public List<T> findByHQL(String hql);
	public List<T> findByHql(String queryString, Object... values);
	public Object findUnique(String queryString, Object... values);
	public T findUniqueByHql(String queryString, Object... values);
	public T findUniqueByNamedQuery(String queryName, Object... values);
	public boolean isPropertyUnique(String propertyName, Object newValue, Object orgValue);
	/**  
     * 模糊查询指定条件对象集合 <br>  
     * 用法：可以实例化一个空的T对象，需要查询某个字段，就set该字段的条件然后调用本方法<br>  
     * 缺点：目前测试貌似只能支持String的模糊查询，虽然有办法重写，但没必要，其他用HQL<br>  
     *   
     * @param entity  
     *            条件实体  
     * @return 结合  
     */  
    public List<T> findByExample(T entity) ;
	//使用HSQL语句直接增加、更新、删除实体
	 public int bulkUpdate(String queryString);
	 public int bulkUpdate(String queryString, Object...values);
	public T get(Class<T> c, ID id);
	public void saveOrUpdateAll(Collection<T> entities);
	public void deleteWithLock(T entity, LockMode lock);
	
	public List<T> findByNamedQuery(String queryName, String[] paramNames,
		      Object[] values);
	public List<T> findByNamedQuery(String queryName, Object...values);
	public List<T> findByNamedQuery(String queryName);
	
	public void lock(T entity, LockMode lockMode); 
	//-------------
	/**
	   * 使用指定的检索标准检索数据，返回指定统计函数
	   * 
	   * @param criteria
	   * @param propertyName
	   * @param StatName
	   *            (max,min,avg,sum)
	   * @return
	   */
	  public Object getStatValue(DetachedCriteria criteria, String propertyName,
	      String StatName);
	  /** *//**
	   * 使用指定的检索标准检索数据，返回指定范围的记录总数
	   * 
	   * @param criteria
	   * @return
	   */
	  public Integer getRowCount(DetachedCriteria criteria);
	  public List<T> findByCriteria(Criterion[] criterions);
	
	
	  public Iterator<T> iterate(String hql, Object...values);
	  /************begin  sql****************/
	  public Map<String, Object> findBySqlUniqueToMap(String queryString,Map<String, Object> values);
	  public Map<String, Object> findBySqlUniqueToMap(String queryString,Object... values);
	  public int executeSql(String queryString, Map<String, Object> values);
	  public int executeSql(String queryString, Object... values);
	  public Object findUniqueBySql(String sql, Object... values);
	  public Object findUniqueBySql(String sql,Map<String, Object> values);
	  public  List<T> getAll(Class<?> entityClass, String orderBy, boolean isAsc);
	  public List<Map<String, Object>> findBySqlToMapList(String queryString, Map<String, Object> values);
	  public List<Map<String, Object>> findBySqlToMapList(String queryString,Object... values);
	  /*************end   sql***************/
}
